/*
 * iBus.cpp
 *
 *  Created on: 05/07/2014
 *      Author: nicolas
 */

#include "iBus.h"
#include <syslog.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sstream>

using namespace std;

iBus::iBus(int camino, int id, Tipos::LugarDeSala lugar) {
	this->numeroSala = camino;
	this->id = id;
	this->lugar = lugar;
	this->colaSistema = new ColaMensajes(RUTA, COLASISTEMA);
	this->colaRespuesta = new ColaInterfaz(RUTA, COLARECIBO_CLI);
	this->idSalaSalida = rpc.consultarIdSala(numeroSala, Tipos::TP_SALIDA,
			lugar);
//	generarCorte(idSalaSalida);
}

//iBus::iBus(Tipos::LugarDeSala lugar, int numSala) {
//	this->numeroSala = numSala;
//	this->id = id;
//	this->lugar = lugar;
//	this->colaSistema = new ColaMensajes(RUTA, COLASISTEMA);
//	this->colaRespuesta = new ColaMensajes(RUTA, COLARECIBO_CLI);
//	this->idSalaSalida = rpc.consultarIdSala(numeroSala, Tipos::TP_SALIDA, lugar);
//}

void iBus::recibirMensaje() {
//	long int idSala = rpc.consultarIdSala(numeroSala, Tipos::TP_SALIDA, lugar);
//	long int idSala = idServer.idSala(numeroSala, Tipos::TP_SALIDA, lugar);

	static bool corte = false;

	if (!corte) {
		generarCorte(idSalaSalida);
		corte = true;
	}

	MENSAJE msg;
	//colaRespuesta->recibir(&msg, TAM_MENSAJE, idSalaSalida);
	colaRespuesta->recibirMensaje(msg, Tipos::MSJ_SUBIR_PERSONA_A_BUS,
			idSalaSalida);

	if (msg.tipo != Tipos::MSJ_SUBIR_PERSONA_A_BUS)
		syslog(LOG_ERR,
				"Error de tipo de mensaje esperado, esperado: %i, recibido: %i",
				(int) Tipos::MSJ_SUBIR_PERSONA_A_BUS, (int) msg.tipo);
	syslog(LOG_INFO,
			"Se recibio el mensaje interno: destinatario: %li, origen: %li, id: %i, respuesta: %i",
			msg.destinatario, msg.origen, msg.id, msg.respuesta);
}

void iBus::enviarRespuesta(int idPersona) {
	long int idBus = rpc.consultarIdBus(numeroSala);
//	long int idBus = idServer.idBUS(numeroSala);
//	long int idSala = rpc.pedirIdSala(numeroSala, Tipos::TP_SALIDA, lugar);
//	long int idSala = idServer.idSala(numeroSala, Tipos::TP_SALIDA, lugar);
	MENSAJE msg;

	msg.destinatario = idSalaSalida;
	msg.destinatarioFinal = idBus;
	msg.origen = idSalaSalida;
	msg.id = idPersona;
	msg.tipo = Tipos::MSJ_CONFIRMAR_SUBIDA_A_BUS;
	colaSistema->enviar(&msg, TAM_MENSAJE);
	syslog(LOG_INFO,
			"Se envio el mensaje: destinatario: %li, origen: %li, id: %i, respuesta: %i",
			msg.destinatario, msg.origen, msg.id, msg.respuesta);
}

int iBus::recibirPermisoBajar() {
	MENSAJE msg;
	//colaRespuesta->recibir(&msg, TAM_MENSAJE, id);
	colaRespuesta->recibirMensaje(msg, Tipos::MSJ_BAJAR_DE_BUS,
			Tipos::MSJ_BUS_ROTO, id);

	if (msg.tipo != Tipos::MSJ_BAJAR_DE_BUS && msg.tipo != Tipos::MSJ_BUS_ROTO)
		syslog(LOG_ERR,
				"Error de tipo de mensaje esperado, esperado: %i, recibido: %i",
				(int) Tipos::MSJ_BAJAR_DE_BUS, (int) msg.tipo);
	syslog(LOG_INFO,
			"Se recibio el mensaje: destinatario: %li, origen: %li, id: %i, respuesta: %i",
			msg.destinatario, msg.origen, msg.id, msg.respuesta);
	if (msg.tipo == Tipos::MSJ_BUS_ROTO)
		return msg.id;
	else
		return 0;
}

void iBus::confirmarBajada() {
	long int idBus = rpc.consultarIdBus(numeroSala);
//	long int idBus = idServer.idBUS(numeroSala);
	MENSAJE msg;
	msg.destinatario = id;
	msg.destinatarioFinal = idBus; // valor viejo BUS;
	msg.origen = id;
	msg.id = id;
	msg.tipo = Tipos::MSJ_CONFIMAR_BAJADA_DE_BUS;
	colaSistema->enviar(&msg, TAM_MENSAJE);
	syslog(LOG_INFO,
			"Se envio el mensaje: destinatario: %li, origen: %li, id: %i, respuesta: %i",
			msg.destinatario, msg.origen, msg.id, msg.respuesta);
}

void iBus::generarCorte(int id) {
	stringstream idAux;
	idAux << id;
	int pid = fork();
	if (pid == 0) {
		execlp("./conexBrokerCliente", "conexBrokerCliente",
				idAux.str().c_str(), "E", NULL);
		perror("Error en el exec conexionBrokerCliente");
		exit(1);
	}
	pid = fork();
	if (pid == 0) {
		execlp("./conexBrokerCliente", "conexBrokerCliente",
				idAux.str().c_str(), "R", NULL);
		perror("Error en el exec conexionBrokerCliente");
		exit(1);
	}
}

void iBus::cambiarDeBus(int idRepuesto) {
	MENSAJE msg;
	msg.destinatario = id;
	msg.destinatarioFinal = idRepuesto;
	msg.origen = id;
	msg.tipo = Tipos::MSJ_CONFIRMAR_SUBIDA_A_BUS;
	colaSistema->enviar(&msg, TAM_MENSAJE);

}
